#include <iostream>
#include <chrono>
#include <thread>

#include <connection/udp.hpp>
#include <proxy/proxy.hpp>

using namespace udp_proxy;

Proxy my_proxy{};

// ConnUdp udp_in{"127.0.0.1", 14551, "192.168.1.3", 18570};
// ConnUdp udp_out{"127.0.0.1", 14641, "192.168.215.89", 14551};

// void send_in(uint8_t *buf, size_t len){
//     udp_in.send_data(buf, len);
// }

// void send_out(uint8_t *buf, size_t len){
//     udp_out.send_data(buf, len);
//     // printf("send_out, len=%d\n", len);
// }

// void test01(){
//     uint8_t buffer[20] = "hello world\n";
//     udp_out.send_data(buffer, 20);
// }

// void test02(){
//     udp_in.connect(&send_out);
//     udp_out.connect(&send_in);
// }

void test03(){
    // my_proxy.load_config("config/config.txt");
    my_proxy.load_config("D:\\A2-alex\\tools\\udp_proxy\\config\\config.txt");
    my_proxy.connect();
}

/**
 * @brief 测试智能指针
 *
 */
std::shared_ptr<ConnUdp> udp_in, udp_out;
void test04(){
    udp_in = std::make_shared<ConnUdp>("127.0.0.1", 14551, "192.168.1.3", 18570);
    udp_out = std::make_shared<ConnUdp>("127.0.0.1", 14641, "192.168.215.89", 14551);

    // udp_in->connect(&send_out);
    // udp_out->connect(&send_in);
    udp_in->connect(std::bind(&ConnUdp::send_data, udp_out, std::placeholders::_1, std::placeholders::_2));
    udp_out->connect(std::bind(&ConnUdp::send_data, udp_in, std::placeholders::_1, std::placeholders::_2));
}


int main(int argc, char *argv[]){
    test03();
    // test04();
    // test();
    while (1){
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}